package datastructure;
/**
 * Java顺序表的实现
 * @author 杨昊天
 * @param <E> 泛型
 */
public class LinerList <E>{
	private Object[] arr;//保存顺序表
	private int last;//保存表的容量
	private int index;//保存当前下表，空表默认为-1；
	/**
	 * 空构造，初始化长度为十
	 */
	public LinerList() {
		this(10);
	}
	/**
	 * 初始化，声明线性表长度
	 * @param size  顺序表的初始化长度
	 */
	public LinerList (int size) {
		if(size>0) {
			this.last=size;
			this.arr=new Object[size];
			this.index=-1;
		}else {
			throw new RuntimeException(".....");
		}
	}
	/**
	 * 判断表是否已满
	 * @return 满返回ture 否则false
	 */
	public boolean isFull() {
		if(index==this.last-1) {
			this.last*=2;
			Object[] newArr=new Object[last];
			for(int i=0;i<this.arr.length;i++) {
				newArr[i]=this.arr[i];
			}
			this.arr=newArr;
			return true;
		}
		return false;
	}
	/**
	 * 判断下标是否合法
	 * @param position 输入的需要进行操作的下标
	 * @return 合法返回true 否则false
	 */
	public boolean isIndex(int position) {
		if(position>=0&&position<index) {
			return true;
		}else {
			throw new RuntimeException(".....");
		}
	}
	/**
	 * 追加元素，追加前判断表空间是否已满
	 * @param e 要追加的元素
	 * @return 合法返回true，不合法声明异常
	 */
	public boolean add(E e) {
		this.isFull();
		arr[++index]=e;
		return true;
	}
	/**
	 * 删除元素
	 * @param position 要删元素的下标
	 * @return 合法返回true，不合法声明异常
	 */
	public boolean delete(int position) {
		this.isIndex(position);
		for(int i=position;i<index-1;i++) {
			this.arr[i]=this.arr[i+1];
		}
		this.arr[index--]=null;
		return true;
	}
	/**
	 * 改变元素，改前需判断下表是否合法
	 * @param position 要改元素的位置
	 * @param e 更改后的元素
	 * @return 返回true
	 */
	public boolean set(int position,E e) {
		this.isIndex(position);
		this.arr[position]=e;
		return true;
	}
	/**
	 * 查找元素
	 * @param position 要查找元素的下标
	 * @return 返回该元素
	 */
	public Object get(int position) {
		this.isIndex(position);
		return this.arr[position];
	}
	/**
	 * 插入操作 使用前徐判断表空间是否满，是否下标合法
	 * @param position 要插入位置
	 * @param e 插入的元素
	 * @return true
	 */
	public boolean insert(int position,E e) {
		this.isIndex(position);
		this.isFull();
		for(int i=++index;i>position;i--) {
			this.arr[i]=this.arr[i-1];
		}
		this.arr[position]=e;
		return true;
	}
	/**
	 * 得到线性表当前的长度
	 * @return index
	 */
	public int size() {
		return this.index;
	}
}